package com.tea.controller;

import com.tea.Model.DynamicType;
import com.tea.Model.dto.DynamicTypeCreateDTO;
import com.tea.Model.dto.DynamicTypeUpdateDTO;
import com.tea.service.DynamicTypeService;
import com.tea.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;

/**
 * 商家动态分类管理
 */
@RestController
@RequestMapping("/dynamicType")
@Slf4j
public class DynamicTypeController {

    @Resource
    private DynamicTypeService dynamicTypeService;

    /**
     * 创建商家动态分类
     * @param createDTO 创建DTO
     * @return 创建结果
     */
    @PostMapping("/create")
    public Result<String> createDynamicType(@RequestBody @Valid DynamicTypeCreateDTO createDTO) {
        try {
            // 检查分类名称是否已存在
            if (dynamicTypeService.isTypeNameExists(createDTO.getTypeName(), null)) {
                return Result.error("分类名称已存在");
            }

            // 转换DTO为实体
            DynamicType dynamicType = new DynamicType();
            BeanUtils.copyProperties(createDTO, dynamicType);

            // 创建分类
            boolean success = dynamicTypeService.createDynamicType(dynamicType);
            return success ? Result.success("创建成功") : Result.error("创建失败");
        } catch (Exception e) {
            log.error("创建动态分类失败", e);
            return Result.error("创建失败：" + e.getMessage());
        }
    }

    /**
     * 查询商家动态分类列表
     * @return 分类列表
     */
    @GetMapping("/list")
    public Result<List<DynamicType>> listDynamicTypes() {
        try {
            List<DynamicType> list = dynamicTypeService.listAllTypesOrderBySort();
            return Result.success(list);
        } catch (Exception e) {
            log.error("查询动态分类列表失败", e);
            return Result.error("查询失败：" + e.getMessage());
        }
    }

    /**
     * 根据ID获取单个分类详情
     * @param id 分类ID
     * @return 分类详情
     */
    @GetMapping("/detail/{id}")
    public Result<DynamicType> getDynamicTypeDetail(@PathVariable Long id) {
        try {
            if (id == null) {
                return Result.error("分类ID不能为空");
            }

            DynamicType dynamicType = dynamicTypeService.getById(id);
            if (dynamicType == null) {
                return Result.error("分类不存在");
            }

            return Result.success(dynamicType);
        } catch (Exception e) {
            log.error("获取动态分类详情失败，ID: {}", id, e);
            return Result.error("获取详情失败：" + e.getMessage());
        }
    }

    /**
     * 更新商家动态分类信息
     * @param updateDTO 更新DTO
     * @return 更新结果
     */
    @PutMapping("/update")
    public Result<String> updateDynamicType(@RequestBody @Valid DynamicTypeUpdateDTO updateDTO) {
        try {
            // 检查分类是否存在
            DynamicType existingType = dynamicTypeService.getById(updateDTO.getDynamicTypeId());
            if (existingType == null) {
                return Result.error("分类不存在");
            }

            // 检查分类名称是否已存在（排除当前分类）
            if (dynamicTypeService.isTypeNameExists(updateDTO.getTypeName(), updateDTO.getDynamicTypeId())) {
                return Result.error("分类名称已存在");
            }

            // 转换DTO为实体
            DynamicType dynamicType = new DynamicType();
            BeanUtils.copyProperties(updateDTO, dynamicType);

            // 更新分类
            boolean success = dynamicTypeService.updateDynamicType(dynamicType);
            return success ? Result.success("更新成功") : Result.error("更新失败");
        } catch (Exception e) {
            log.error("更新动态分类失败，ID: {}", updateDTO.getDynamicTypeId(), e);
            return Result.error("更新失败：" + e.getMessage());
        }
    }

    /**
     * 删除商家动态分类（逻辑删除）
     * @param id 分类ID
     * @return 删除结果
     */
    @DeleteMapping("/delete/{id}")
    public Result<String> deleteDynamicType(@PathVariable Long id) {
        try {
            if (id == null) {
                return Result.error("分类ID不能为空");
            }

            // 检查分类是否存在
            DynamicType dynamicType = dynamicTypeService.getById(id);
            if (dynamicType == null) {
                return Result.error("分类不存在");
            }

            // 检查是否有动态使用了该分类
            if (dynamicTypeService.isTypeInUse(id)) {
                return Result.error("该分类下存在动态，不能删除");
            }

            // 逻辑删除分类
            boolean success = dynamicTypeService.removeById(id);
            return success ? Result.success("删除成功") : Result.error("删除失败");
        } catch (Exception e) {
            log.error("删除动态分类失败，ID: {}", id, e);
            return Result.error("删除失败：" + e.getMessage());
        }
    }
}